package Service;

import Dao.ArticleDao;
import Model.Article;
import Model.Tag;
import Model.User;
import Utils.DaoFactory;

import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.List;

/**
 * @author zyp
 * date 2022-03-08
 */
public class ArticleServiceImpl implements ArticleService {
    private ArticleDao articleDao = DaoFactory.getArticleDao();

    /*
     * 新增文章的业务逻辑：
     *   1.如果想要新增文章，首先需要向article里面新增一条记录，然后获取新增的这个文章的id
     *       具体步骤：
     *           1.创建prepareStatement的时候，需要指定第二个参数为 Statement.RETURN_GENERATED_KEYS,表示执行prepareStatement以后返回自增主键的值
     *           2.执行完prepareStatement.executeUpdate()以后使用preparedStatement.getGeneratedKeys()来获得一个resultSet对象
     *           3.遍历resultSet，通过resultSet.getInt(1)来获得自增主键的值 注意：这里不能写getInt(“id）
     *
     *   2.因为新增的文章需要指明标签，所以需要在tag表里面新增记录，但是新增tag之前需要先查找tag表里面是否有这个标签，如果有的话，就不新增
     *   如果没有的话就新增
     *
     *   3.在article_tag表里面新增记录
     * */
    @Override
    public boolean addArticle(Article article, HttpSession session) {
        User loginUser = (User) session.getAttribute("loginUser");
        //1：调用addArticle方法来新增一篇文章，获得新增文章的id
        int article_id = articleDao.addArticle(article, loginUser.getId());
        //2：创建一个tagIds数组，用来保存每一个标签的id值,这个数组的目的是为了在中间关联表里面新增数据
        List<Integer> tagIds = new ArrayList<>();

        //3:遍历前端发送到后端的tag数组，对每一个tag标签进行处理
        for (String tagName : article.getTags()) {
            //4:根据tagname获得tag对象
            Tag tag = articleDao.findTagByTagName(tagName);
            //5：如果tag对象的id是0的话，表示数据库里面找不到这个tag，就把这个tag新增到数据库里面
            if (tag.getId() == 0) {
                //5:把新增tag的id放进tagIds数组里面，为后面中间关联表做准备
                tagIds.add(articleDao.addTag(tagName));
            } else {
                tagIds.add(tag.getId());
            }
        }

        //6:把文章的id和tag的id新增到article_tag这个中间关联表里面去
        //7:遍历tagIds这个数组，然后新增每一条记录
        //8：设置一个标志位flag = 0，每成功添加一次数据进article_tag表，将这个flag+1，遍历结束以后，如果flag的值等于数组的长度，说明
        //每一条数据都添加进了article_flag表，证明添加成功，返回true，否则返回false
        int flag = 0;
        for (int tagId : tagIds) {
            if (articleDao.addArticleTag(article_id, tagId) == 1) {
                flag += 1;
            }
        }

        if (flag == tagIds.size()) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public int editArticle(Article article, int userId) {
        return 0;
    }


    @Override
    public List<Article> findAllArticles(HttpSession httpSession) {
        User loginUser = (User) httpSession.getAttribute("loginUser");

        return articleDao.findAllArticlesByUserId(loginUser.getId());
    }

    @Override
    public Article findArticleById(int id) {
        return articleDao.findArticleById(id);
    }

    @Override
    public boolean delArticle(Article article, int id) {
        return articleDao.delArticle(article, id);
    }

    @Override
    public List<Article> fAllArticles() {
        return articleDao.findAllArtic();
    }
}
